﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace Demo
{
    class Program
    {
        int num = 10;//设置当前总票数
        void Ticket()
        {
            while (true)//设置无限循环
            {
                lock (this)//锁定代码块，以便线程同步
                {
                    if (num > 0)//判断当前票数是否大于0
                    {
                        Thread.Sleep(100);//使当前线程休眠100毫秒
                        Console.WriteLine(Thread.CurrentThread.Name + "----票数" + num--);//票数减1
                    }
                }
            }
        }


        static void Main(string[] args)
        {
            Program p = new Program();//创建对象，以便调用对象方法
            Thread tA = new Thread(new ThreadStart(p.Ticket));//分别实例化4个线程，并设置名称
            tA.Name = "线程一";
            Thread tB = new Thread(new ThreadStart(p.Ticket));
            tB.Name = "线程二";
            Thread tC = new Thread(new ThreadStart(p.Ticket));
            tC.Name = "线程三";
            Thread tD = new Thread(new ThreadStart(p.Ticket));
            tD.Name = "线程四";
            tA.Start(); //分别启动线程
            tB.Start();
            tC.Start();
            tD.Start();
            Console.ReadLine();
        }

        //使用Monitor实现线程同步
        //void Ticket()
        //{
        //    while (true)//设置无限循环
        //    {
        //        Monitor.Enter(this);//锁定当前线程
        //        if (num > 0)//判断当前票数是否大于0
        //        {
        //            Thread.Sleep(100);//使当前线程休眠100毫秒
        //            Console.WriteLine(Thread.CurrentThread.Name + "----票数" + num--);//票数减1
        //        }
        //        Monitor.Exit(this);//释放当前线程
        //    }
        //}

        //使用Mutex实现线程同步
        //void Ticket()
        //{
        //    while (true)//设置无限循环
        //    {
        //        Mutex myMutex=new Mutex(false);//创建Mutex类对象
        //        myMutex.WaitOne();//阻塞当前线程
        //        if (num > 0)//判断当前票数是否大于0
        //        {
        //            Thread.Sleep(100);//使当前线程休眠100毫秒
        //            Console.WriteLine(Thread.CurrentThread.Name + "----票数" + num--);//票数减1
        //        }
        //        myMutex.ReleaseMutex();//释放Mutex对象
        //    }
        //}
    }
}
